]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
gdm: honor timed login delay even if animations disabled
authorRay Strode <rstrode@redhat.com>
Tue, 18 Aug 2015 16:02:17 +0000 (12:02 -0400)
committerRay Strode <rstrode@redhat.com>
Tue, 20 Feb 2018 15:18:18 +0000 (10:18 -0500)
gnome-shell currently initiates an automatic login attempt if
timed login is enabled and the timed login animation completes.

Unfortunately, if animations are disabled (as is the case for
virtual machines) then the timed login animation will complete
instantly, and timed login will proceed immediately after gnome-shell
has noticed the user is idle for 5 seconds.

This commit addresses that problem by initiating timed login and the
animation from a main loop timeout, instead of using the tweener api.

js/gdm/loginDialog.js

index 1cae3db85a677729e5682ac7bce55ada05f5347b..dd7116ce31f893686285181016a09c5ad2042efc 100644 (file)
@@ -126,20 +126,34 @@ var UserListItem = new Lang.Class({
         let hold = new Batch.Hold();
 
         this.hideTimedLoginIndicator();
-        Tweener.addTween(this._timedLoginIndicator,
-                         { scale_x: 1.,
-                           time: time,
-                           transition: 'linear',
-                           onComplete: function() {
-                               hold.release();
-                           },
-                           onCompleteScope: this
-                         });
+
+        let startTime = GLib.get_monotonic_time();
+
+        this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT,
+                                                      33,
+                                                      Lang.bind(this, function() {
+                                                          let currentTime = GLib.get_monotonic_time();
+                                                          let elapsedTime = (currentTime - startTime) / GLib.USEC_PER_SEC;
+                                                          this._timedLoginIndicator.scale_x = elapsedTime / time;
+                                                          if (elapsedTime >= time) {
+                                                              this._timedLoginTimeoutId = 0;
+                                                              hold.release();
+                                                              return GLib.SOURCE_REMOVE;
+                                                          }
+
+                                                          return GLib.SOURCE_CONTINUE;
+                                                      }));
+
+        GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId');
+
         return hold;
     },
 
     hideTimedLoginIndicator: function() {
-        Tweener.removeTweens(this._timedLoginIndicator);
+        if (this._timedLoginTimeoutId) {
+            GLib.source_remove(this._timedLoginTimeoutId);
+            this._timedLoginTimeoutId = 0;
+        }
         this._timedLoginIndicator.scale_x = 0.;
     }
 });